package com.chunlin.map;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapTest {
    //注意：
    //1. Map是一个接口，不能直接实例化对象，如果要实例化对象只能实例化其实现类TreeMap或者HashMap
    //2. Map中存放键值对的Key是唯一的，value是可以重复的
    //3. 在TreeMap中插入键值对时，key不能为空，否则就会抛NullPointerException异常，value可以为空,但是HashMap的key和value都可以为空
    //4. Map中的Key可以全部分离出来，存储到Set中来进行访问(因为Key不能重复)。
    //5. Map中的value可以全部分离出来，存储在Collection的任何一个子集合中(value可能有重复)。
    //6. Map中键值对的Key不能直接修改，value可以修改，如果要修改key，只能先将该key删除掉，然后再来进行重新插入

    public static void main(String[] args) {
        test1();
//        test2();
    }

    private static void test1() {
        TreeMap<String, String> m = new TreeMap<>();

        // 如果key不存在，会将key-value的键值对插入到map中,返回null
        m.put("林冲", "豹子头");
        m.put("鲁智深", "花和尚");
        m.put("武松", "行者");
        m.put("宋江", "及时雨");
        String str = m.put("李逵", "黑旋风");
        System.out.println(m.size());
        System.out.println(m);

        // put(key,value): 注意key不能为空，但是value可以为空
        // key如果为空，会抛出空指针异常
        //m.put(null, "花名");
        str = m.put("无名", null);
        System.out.println(m);
        System.out.println(m.size());

        // put(key, value):
        // 如果key存在，会使用value替换原来key所对应的value，返回旧value
        str = m.put("李逵", "铁牛");
        System.out.println(m);
        System.out.println(m.size());

        // get(key): 返回key所对应的value
        // 如果key存在，返回key所对应的value
        // 如果key不存在，返回null
        System.out.println(m.get("鲁智深"));
        System.out.println(m.get("史进"));

        //GetOrDefault(): 如果key存在，返回与key所对应的value，如果key不存在，返回一个默认值
        System.out.println(m.getOrDefault("李逵", "黑旋风"));
        System.out.println(m.getOrDefault("史进", "九纹龙"));
        System.out.println(m.size());

        //containKey(key)：检测key是否包含在Map中，时间复杂度：O(logN)
        // 按照红黑树的性质来进行查找
        // 找到返回true，否则返回false
        System.out.println(m.containsKey("林冲"));
        System.out.println(m.containsKey("史进"));

        // containValue(value): 检测value是否包含在Map中，时间复杂度: O(N)
        // 找到返回true，否则返回false
        System.out.println(m.containsValue("豹子头"));
        System.out.println(m.containsValue("九纹龙"));

        // 打印所有的key
        // keySet是将map中的key防止在Set中返回的
        for (String name : m.keySet()) {
            System.out.println(name + " ");
        }
        System.out.println();

        // 打印所有的value
        // values()是将map中的value放在collect的一个集合中返回的
        for (String nickname : m.values()) {
            System.out.println(nickname + " ");
        }
        System.out.println();

        // 打印所有的键值对
        // entrySet(): 将Map中的键值对放在Set中返回了
        for (Map.Entry<String, String>entry : m.entrySet()) {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
            //entry中的修改对原TreeMap也生效
            if (entry.getKey() == "林冲") {
                entry.setValue("小林子");
            }
        }

        System.out.println();
        System.out.println(m);
    }
}
